home *** CD-ROM | disk | FTP | other *** search
/ The Best of MacTutor - S…e Code for Volumes 1 to 5 / The Best of MacTutor - Source Code for Volume 1-5 (Wayzata Technology)(6031)(1990).bin / Source Code / #07 (Mar 86) / Pascal 2-3 / Small Flight Source / flipPix.asm < prev    next >
Assembly Source File  |  1986-02-13  |  3KB  |  75 lines

  1. ;
  2. ;  flippix -- complement a pixel on the screen, given its global coordinates.
  3. ;  procedure flipPix (h, v: integer); external;
  4. ;
  5. ;    Written by Mike Morton for MacTutor
  6. ;    Converted to MDS Assembly by David E. Smith
  7. ;
  8. ;
  9.     xdef    flipPix
  10.     
  11.     include QuickEqu.D
  12.     include SysEqu.D
  13.     include ToolEqu.D
  14.     include    MacTraps.D
  15.     
  16.     MACRO .equ    =equ|        ; convert lisa stuff to mds
  17.     MACRO _hideCurs = _HideCursor|
  18.     MACRO _showCurs = _ShowCursor|
  19.     
  20.     CrsrRect    equ    $83C    ;SysEqu stuff
  21.     grafGlob    equ    $0
  22.                 
  23. ; parameter offsets from the stack pointer:
  24.  
  25. bitH    .equ 4                ; horizontal pixel coordinate
  26. bitV    .equ bitH+2            ; vertical pixel coordinate
  27. plast   .equ bitV+2            ; address just past last parameter
  28. psize   .equ plast-bitH            ; size of parameters, in bytes
  29.  
  30. ; entrance: set up a stack frame, save some registers, hide cursor if needed.
  31. flipPix:
  32.     
  33.         clr.w D2            ; clear flag saying cursor was hidden
  34.         movem.w bitH(A7),D0/D1  ; load v. and h. coordinates together
  35.  
  36.         ; see if we'll need to hide the cursor while we draw
  37.         lea CrsrRect+top,A0     ; point to rectangle the cursor covers
  38.         cmp.w (A0)+,D0            ; compare v to rect.top
  39.         blt.s nohide            ; if too small (above r.top), don't hide
  40.         cmp.w (A0)+,D1            ; compare h to rect.left
  41.         blt.s nohide            ; if too small (left of r.left), don't hide
  42.         cmp.w (A0)+,D0            ; compare v to rect.bottom
  43.         bge.s nohide            ; if too large (below r.bottom), don't hide
  44.         cmp.w (A0)+,D1            ; compare h to rect.right
  45.         bge.s nohide            ; if too large (right of r.right, don't hide
  46.  
  47.         _hideCurs            ; must briefly hide the cursor to draw here
  48.         move.w #1,D2            ; flag that we did so
  49. nohide  swap D2                ; hidden or not: slide flag up to top of D2
  50.  
  51.         move.l grafGlob(A5),A0  ; point to quickdraw globals
  52.         move.l thePort(A0),A0   ; point to the current grafport
  53.         mulu portBits+rowBytes(A0),D0 ; v. times stride is byte offset of row
  54.  
  55.         move.b D1,D2            ; copy h. coord (low 3 bits) for bit offset
  56.         lsr.w #3,D1            ; extract byte offset
  57.         add.w D1,D0            ; combine v. and byte component of h.
  58.  
  59.         not.b D2            ; make the bit# 68000-style (x := 7-x)
  60.         move.l portBits+baseAddr(A0),A0 ; pick up base address of bitmap
  61.         bchg D2,0(A0,D0.w)      ; flip the bit in the right byte
  62.  
  63.         swap D2                ; bring back cursor-hidden flag
  64.         tst.w D2            ; is it set?
  65.         beq.s return            ; no -- all done
  66.         _showCurs            ; yes -- show the cursor
  67.  
  68. return
  69.     
  70.         move.l (A7)+,A0            ; pop return address
  71.         add.l #psize,A7            ; unstack parameters
  72.         jmp (A0)            ; home to mother
  73.  
  74. .end                    ; of procedure flipPix
  75.